package br.com.vti.sisp_sicrim.antigo.util;

import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.ioc.spring.VRaptorRequestHolder;

/**
 * 
 * Classe utilit�ria de controles
 * 
 * @author Incode
 * 
 */

public class UtilBean {

	public static String funcao;
	public String paginaAtual = "";
	public static String acoesFinais = "";
	public static StringBuilder mensagem = null;
	public static final String ctt_processa = "0";
	public static final String ctt_ajuda = "1";
	public static final String ctt_pf2 = "2";
	public static final String ctt_retorna = "3";
	public static final String ctt_pf4 = "4";
	public static final String ctt_confirma = "5";
	public static final String ctt_pf6 = "6";
	public static final String ctt_anterior = "7";
	public static final String ctt_proxima = "8";
	public static final String ctt_pf9 = "9";
	public static final String ctt_ajuda0 = "A";

	protected static Logger getLogger() {
		return Logger.getLogger("UtilBean");
	}

	public static void redireciona(String pagina, Result result, String origem) {
		// result.redirectTo(pagina);
		// result.include("mensagem","teste 333");
		result.include("programa", origem);
		result.forwardTo(pagina);
	}

	public static void index(String pagina, Result result, String origem) {
		result.redirectTo("/");

	}

	public static void mensagemTexto(Object... texto) {
		if (mensagem == null) {
			mensagem = new StringBuilder();
		}
		mensagem.append(concatena(texto)).append("<br/>");
	}

	public static String concatena(Object... arg2) {
		StringBuilder msg = new StringBuilder();
		for (Object objeto : arg2) {
			msg.append(objeto);
		}

		return msg.toString();
	}

	public static void adicionarRetorno(Object retorno, String nome, Result result) {

		result.include(nome, retorno);
	}

	public static String getUser() {
		return "USER";
	}

	public static String getInitUser() {
		return "SISPUS01";
	}

	public static String getInitProgram() {
		return "NATURAL";
	}

	public static boolean validaSelecao(String[] args) {

		int ind, cont = 0;
		for (ind = 0; ind < args.length; ind++) {

			if (args[ind] != null && args[ind].trim().length() != 0) {
				cont++;
			}

			if (cont >= 1)
				return false;
		}

		if (cont >= 1)
			return false;
		else
			return true;
	}

	public static void salvaAcao(String acao) {
		if (acoesFinais.equals("")) {
			acoesFinais = acao;
		} else {
			acoesFinais = acao + ";" + acoesFinais;
		}

	}

	public static String obterAcao() {
		String acao = "";
		if (acoesFinais != "") {
			if (acoesFinais.contains(";")) {
				acao = acoesFinais.substring(0, acoesFinais.indexOf(";") - 1);
				acoesFinais = acoesFinais.substring(acoesFinais.indexOf(";") + 1);
			} else {
				acao = acoesFinais;
				acoesFinais = "";
			}
		}
		return acao;
	}

	public static void processaAcao() {
		String classe;
		classe = obterAcao();
		while (classe != "") {
			// call the method
			try {
				Class cls = Class.forName(classe);
				Method method = cls.getDeclaredMethod("executar", new Class[] {});
				Object obj = cls.newInstance();
				method.invoke(obj);
			} catch (Exception e) {
			}
			classe = obterAcao();
		}
	}

	public static int inverteData(int dataCorrenteInt) {
		String dataCorrente = String.valueOf(dataCorrenteInt);
		while (dataCorrente.length() < 8)
			dataCorrente = "0" + dataCorrente;
		String dia = dataCorrente.substring(6, 8);
		String mes = dataCorrente.substring(4, 6);
		String ano = dataCorrente.substring(0, 4);
		int res;
		res = Integer.parseInt(dia) * 1000000;
		res = res + Integer.parseInt(mes) * 10000;
		res = res + Integer.parseInt(ano);
		return res;
	}

	public static String inverteDataDDMMYYYY(int dataCorrenteInt) {
		String dataCorrente = String.valueOf(dataCorrenteInt);
		String ret = "";
		while (dataCorrente.length() < 8)
			dataCorrente = "0" + dataCorrente;
		String dia = dataCorrente.substring(6, 8);
		String mes = dataCorrente.substring(4, 6);
		String ano = dataCorrente.substring(0, 4);
		ret = dia + mes + ano;
		if (ret.equals("00000000"))
			ret = "0";

		return ret;
	}

	public static int inverteDataYYYYMMDD(String data) {
		while (data.length() < 8)
			data = "0" + data;
		String dia = data.substring(0, 2);
		String mes = data.substring(2, 4);
		String ano = data.substring(4, 8);

		return Integer.parseInt(ano + mes + dia);
	}

	public static String preencheDDMMYYYY(String data) {
		while (data.length() < 8)
			data = "0" + data;

		return data;
	}

	public static String inverteDataToYYYYMMDD(String data) {
		while (data.length() < 8)
			data = "0" + data;
		String dia = data.substring(0, 2);
		String mes = data.substring(2, 4);
		String ano = data.substring(4, 8);

		return ano + mes + dia;
	}

	public static int inverteDataCorrente() {
		int datacorr = obtemDataCorrente();
		return inverteData(datacorr);
	}

	public static int obtemDataCorrente() {
		String data = new SimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime());
		return Integer.parseInt(data);
	}

	public static String obtemDataDia() {
		String data = new SimpleDateFormat("dd/MM/yyyy").format(Calendar.getInstance().getTime());
		return data;
	}

	public static String obtemHoraDia() {
		String hora = new SimpleDateFormat("HHmmss").format(Calendar.getInstance().getTime());
		return hora;
	}

	public static long extraiDigitos(long numero, int tamanho, int inicio, int qtdedig) {
		if (inicio > tamanho)
			return -1;
		if (inicio + qtdedig - 1 > tamanho)
			return -1;
		String numstr = String.valueOf(numero);
		while (numstr.length() < tamanho) {
			numstr = "0" + numstr;
		}
		// numstr = "0" + numstr;
		numstr = numstr.substring(inicio, inicio + qtdedig);
		return Integer.valueOf(numstr);
	}

	public static long extraiDigitos(String numero, int tamanho, int inicio, int qtdedig) {
		if (inicio > tamanho)
			return -1;
		if (inicio + qtdedig - 1 > tamanho)
			return -1;
		String numstr = String.valueOf(numero);
		while (numstr.length() < tamanho)
			numstr = "0" + numstr;
		numstr = "0" + numstr;
		numstr = numstr.substring(inicio, inicio + qtdedig);
		return Integer.valueOf(numstr);
	}

	public static String moveSubstring(Object obj, int ini, int tam, String tipo, Object sub) {
		String res, p1, p2, var, valor;
		if (ini < 0) {
			return "";
		}
		if (obj == null) {
			var = "";
		} else {
			var = String.valueOf(obj);
		}
		if (sub == null)
			valor = "";
		else
			valor = String.valueOf(sub);
		while (ini + tam > var.length())
			var = var + " ";
		if (ini == 0)
			p1 = "";
		else
			p1 = var.substring(0, ini);
		p2 = var.substring(ini + tam, var.length());
		if (valor.length() < tam) {
			if (tipo.equals("N")) {
				while (valor.length() < tam)
					valor = "0" + valor;
			} else {
				while (valor.length() < tam)
					valor = valor + " ";
			}
		}
		res = p1 + valor + p2;
		return res;
	}

	public static boolean validarMascara(Object valor, String mascara) throws Exception {
		String str;
		long resl = 0;
		int res = 0;
		if (valor == null) {
			valor = "";
		}
		str = (String) valor.toString();
		if (mascara.contains("dd") || mascara.contains("yy")) {
			try {
				DateFormat df = new SimpleDateFormat(mascara);
				df.setLenient(false);
				df.parse(str);
				return true;
			} catch (ParseException e) {
				return false;
			}
		} else if (mascara.equals("N")) {
			try {
				res = Integer.parseInt(str);
				return true;
			} catch (Exception e) {
				return false;
			}
		} else if (mascara.equals("L")) {
			try {
				resl = Long.parseLong(str);
				return true;
			} catch (Exception e) {
				return false;
			}
		} else if (mascara.contains("-")) {
			try {
				String[] mask = mascara.split("-");
				int inicio = Integer.parseInt(mask[0].trim());
				int fim = Integer.parseInt(mask[1].trim());
				resl = Long.parseLong(str.trim());

				if (resl >= inicio && resl <= fim) {
					return true;
				} else {
					return false;
				}
			} catch (Exception e) {
				return false;
			}
		}
		if (mascara.contains("A")) {

			if (mascara.trim().equals("A")) {
				return Character.isLetter(str.charAt(0));
			}

			// implementar outras mascaras de letras aqui

		} else {
			throw new Exception("MASCARA INV�LIDA - " + mascara);
		}
		return false;
	}

	/**
	 * 
	 * @param valor
	 *            : a ser verificado
	 * @param mascara
	 *            : a ser aplicada
	 * @param intervalo
	 *            : ex: 01-10
	 * @param tipo
	 *            : N=N�mero F=NUMERO POSI��ES FIXA
	 * @return true ou false
	 */
	public static boolean validarMascara(Object valor, String mascara, boolean intervalo, char tipo) {
		boolean mascaraValida = false;
		if (tipo == 'N' && intervalo) {
			mascaraValida = validarNumero(valor, mascara);

		} else if (tipo == 'F') {
			mascaraValida = validarNumeroFixo(valor, mascara);
		}

		return mascaraValida;
	}

	private static boolean validarNumero(Object valor, String mascara) {
		boolean mascaraValida = false;
		if (mascara.contains("-") && mascara.length() > 2) {

			long inicio = 0;
			long fim = 0;

			long valorTest = Long.valueOf((valor == null ? "0" : valor) + "");

			String[] intervaloList = mascara.split("-");
			inicio = Integer.valueOf(intervaloList[0]);
			fim = Integer.valueOf(intervaloList[1]);

			if (valorTest >= inicio && valorTest <= fim) {
				mascaraValida = true;
			}
		}

		return mascaraValida;
	}

	private static boolean validarNumeroFixo(Object valor, String mascara) {
		boolean mascaraValida = false;

		try {
			long qtd = Long.valueOf(mascara.trim());
			String vlr = (valor == null ? "0" : valor) + "";
			long qtdVlr = Long.valueOf(vlr.trim());

			if (qtd > 0 && qtdVlr > 0) {

				if (vlr.trim().length() == mascara.trim().length()) {
					mascaraValida = true;
				}
			}

		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		return mascaraValida;
	}

	public static String formataMascara(Object valor, String tipo, int tamanho, String mascara) {
		String str, ret = "";
		int ind, indval;
		if (mascara.substring(mascara.length() - 1).equals("X")) {
			str = mascara.substring(0, mascara.length() - 1);
			try {
				mascara = StringUtils.repeat("X", Integer.parseInt(str));
			} catch (Exception e) {
			}
		}
		str = String.valueOf(valor);
		switch (tipo) {
		case "9":
		case "N": {
			str = str.replace(".", "");
			str = str.replace(",", "");
			while (str.length() < tamanho)
				str = "0" + str;
			str = str.substring(0, tamanho);
			indval = str.length() - 1;
			for (ind = mascara.length() - 1; ind >= 0 && indval >= 0; ind--) {
				if (mascara.substring(ind, ind + 1).equals("Z")) {
					if (str.substring(indval, indval + 1).compareTo("0") >= 0 && str.substring(indval, indval + 1).compareTo("9") <= 0) {
						if (str.substring(indval, indval + 1).equals("0")) {
							mascara = UtilBean.moveSubstring(mascara, ind, 1, "N", "0");
						} else {
							mascara = UtilBean.moveSubstring(mascara, ind, 1, "N", str.substring(indval, indval + 1));
						}
						indval--;
					} else {

					}
				} else if (mascara.substring(ind, ind + 1).equals("9") || mascara.substring(ind, ind + 1).equals("D") || mascara.substring(ind, ind + 1).equals("M") || mascara.substring(ind, ind + 1).equals("Y")) {
					if (str.substring(indval, indval + 1).compareTo("0") >= 0 && str.substring(indval, indval + 1).compareTo("9") <= 0) {
						mascara = UtilBean.moveSubstring(mascara, ind, 1, "N", str.substring(indval, indval + 1));
						indval--;
					}
				} else if (mascara.substring(ind, ind + 1).equals("X")) {
					mascara = UtilBean.moveSubstring(mascara, ind, 1, "N", str.substring(indval, indval + 1));
				} else {

				}
			}
		}
		default: {
			while (str.length() < tamanho)
				str = str + " ";
			str = str.substring(0, tamanho);
			ind = 0;
			indval = 0;
			for (ind = 0; ind < mascara.length() && indval < str.length(); ind++) {

			}
		}

		}
		return mascara;
	}

	public static String subStr(String var, int ini, int tam) {
		if (var == null)
			return "";
		while (var.length() < (ini + tam))
			var = var + " ";
		return var.substring(ini, ini + tam);
	}

	public static int subStr(int varp, int ini, int tam) {
		String var = String.valueOf(varp);
		if (var == null)
			return 0;
		while (var.length() < (ini + tam))
			var = var + " ";
		return Integer.valueOf(var.substring(ini, ini + tam).trim());
	}

	public static HttpSession getSessao() {
		return VRaptorRequestHolder.currentRequest().getRequest().getSession();

	}

	public static ServletContext getServletContext() {

		return getSessao().getServletContext();

	}

	public static String pathFiles() {

		return getServletContext().getRealPath("") + "/files/";
	}

	public static Object[][] fill(Object[][] matriz, Object valor) {
		for (int i = 0; i < matriz.length; i++) {
			for (int j = 0; j < matriz[i].length; j++) {
				matriz[i][j] = valor;
			}
		}

		return matriz;
	}

	public static String formataNumberToHoraHHMMSS(Integer horaProc) {
		String hora = horaProc.toString();
		while (hora.trim().length() < 6)
			hora = "0" + hora;
		String hra = hora.substring(0, 2);
		String min = hora.substring(2, 4);
		String seg = hora.substring(4, 6);

		return hra + ":" + min + ":" + seg;
	}

}
